package bag

import (
	"fmt"
	log2 "github.com/name5566/leaf/log"
	"server/cfg"
	Enplayer "server/game/EnPlayer"
	"server/game/item"
	"strconv"
	"strings"
)

// Item 定义物品结构体

// Backpack 定义背包结构体
type Backpack struct {
	Items map[int]item.Item
	Size  int
	dao   *item.ItemDao
}

const Bagsiz = 999999999

// NewBackpack 创建一个新的背包
func NewBackpack(userId string, size int) *Backpack {
	back := &Backpack{
		Items: make(map[int]item.Item),
		Size:  size,
		dao:   item.NewItemDao(),
	}

	ItemList, err := back.dao.QueryItems(userId, map[string]interface{}{})
	if err != nil {

	}
	for _, item := range ItemList {
		back.Items[item.ItemTmpID] = item
	}
	return back
}

// AddItem 向背包中添加物品
func (bp *Backpack) AddItem(userId string, itemTmpId, quantity int) map[int]item.Item {

	// 消息的发送者

	ItemTmpID := itemTmpId
	// 检查背包是否已满

	newItem := item.Item{
		Name:      "test1",
		Category:  "ceshi1",
		Usable:    true,
		PlayerID:  userId,
		Quantity:  quantity,
		ItemTmpID: itemTmpId,
	}
	// 检查物品是否已存在
	if existingItem, ok := bp.Items[ItemTmpID]; ok {
		existingItem.Quantity += quantity
		bp.Items[ItemTmpID] = existingItem
		bp.dao.AddItem(userId, itemTmpId, quantity)
	} else {
		bp.Items[ItemTmpID] = newItem
		bp.dao.InsertItem(userId, newItem)
	}
	return bp.Items
}

// RemoveItem 从背包中移除物品
func (bp *Backpack) RemoveItem(itemID int, quantity int) error {
	if item, ok := bp.Items[itemID]; ok {
		if item.Quantity < quantity {
			return fmt.Errorf("物品数量不足，无法移除")
		}
		item.Quantity -= quantity
		if item.Quantity == 0 {
			delete(bp.Items, itemID)
		} else {
			bp.Items[itemID] = item
		}
		return nil
	}
	return fmt.Errorf("背包中不存在该物品")
}

// GetItem 获取背包中的物品
func (bp *Backpack) GetItem(itemID int) (item.Item, bool) {
	item, ok := bp.Items[itemID]
	return item, ok
}

// ListItems 列出背包中的所有物品
func (bp *Backpack) ListItems() []item.Item {
	var items []item.Item
	for _, item := range bp.Items {
		items = append(items, item)
	}
	return items
}

// UseItem 使用背包中的物品
func (bp *Backpack) UseItem(itemID int, quantity int) error {
	// 检查物品是否存在
	item, ok := bp.Items[itemID]
	if !ok {
		return fmt.Errorf("背包中不存在该物品")
	}

	// 检查物品是否可使用
	if !item.Usable {
		return fmt.Errorf("该物品不可使用")
	}

	// 检查物品数量是否足够
	if item.Quantity < quantity {
		return fmt.Errorf("物品数量不足，无法使用")
	}
	config := cfg.ConfigData.TbItem.Get(int32(itemID))
	if config != nil {
		switch config.Itemtype {
		case 105:
			paramList := strings.Split(config.Param, "|")
			num, _ := strconv.Atoi(paramList[0])
			Enplayer.EnAddUserXuanChuanTiLi(bp.Items[itemID].PlayerID, num)
			//bp.dao.AddItem(bp.Items[itemID].PlayerID, 101005, num)
			break
		}
	}

	// 模拟使用物品的效果，这里简单打印信息
	log2.Debug("使用了 %d 个 %s\n", quantity, item.Name)

	// 减少物品数量
	item.Quantity -= quantity
	if item.Quantity == 0 {
		delete(bp.Items, itemID)
	} else {
		bp.Items[itemID] = item
	}
	err := bp.dao.UseItem(item.PlayerID, item.ItemTmpID, quantity)
	if err != nil {
		return err
	}
	return nil
}
